package com.shop.cereshop.admin.page.im;

import lombok.Data;
import com.alibaba.fastjson.JSONObject;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 * 腾讯云IM单聊消息响应VO
 * 
 * @author lx
 * @date 2025/10/21 15:43
 * @version 1.0
 */
@Data
public class ImSingleMsgVO {
  /**
   * 请求处理的结果：
   * OK：表示处理成功
   * FAIL：表示失败
   */
  private String ActionStatus;

  /**
   * 错误信息
   */
  private String ErrorInfo;

  /**
   * 错误码：
   * 0：表示成功
   * 非0：表示失败
   */
  private Integer ErrorCode;

  /**
   * 是否全部拉取：
   * 0：表示未全部拉取，需要续拉
   * 1：表示已全部拉取
   */
  private Integer Complete;

  /**
   * 本次拉取到的消息条数
   */
  private Integer MsgCnt;

  /**
   * 本次拉取到的消息里的最后一条消息的时间
   */
  private Integer LastMsgTime;

  /**
   * 本次拉取到的消息里的最后一条消息的标识
   */
  private String LastMsgKey;

  /**
   * 返回的消息列表
   */
  private List<Msg> MsgList;

  /**
   * 消息实体类
   */
  @Data
  public static class Msg {
    /**
     * 发送方账号
     */
    private String From_Account;

    /**
     * 接收方账号
     */
    private String To_Account;

    /**
     * 消息序列号
     */
    private Long MsgSeq;

    /**
     * 消息随机数
     */
    private Integer MsgRandom;

    /**
     * 消息时间戳
     */
    private Long MsgTimeStamp;

    /**
     * 该条消息的属性：
     * 0：表示正常消息
     * 8：表示被撤回的消息
     */
    private Integer MsgFlagBits;

    /**
     * 消息接收方是否发送该条消息的已读回执。
     * 0：表示未发送
     * 1：表示已发送
     */
    private Integer IsPeerRead;

    /**
     * 标识该条消息，可用于 REST API 撤回单聊消息
     */
    private String MsgKey;

    /**
     * 消息体
     */
    private List<MsgBody> MsgBody;

    /**
     * 云自定义数据
     */
    private String CloudCustomData;
  }

  /**
   * 消息体实体类
   */
  @Data
  public static class MsgBody {
    /**
     * 消息元素类别；目前支持的消息对象包括：
     * TIMTextElem：文本消息。
     * TIMLocationElem：地理位置消息。
     * TIMFaceElem：表情消息。
     * TIMCustomElem：自定义消息，当接收方为 iOS 系统且应用处在后台时，此消息类型可携带除文本以外的字段到 APNs。一条组合消息中只能包含一个
     * TIMCustomElem 自定义消息元素。
     * TIMSoundElem：语音消息。
     * TIMImageElem：图像消息。
     * TIMFileElem：文件消息。
     * TIMVideoFileElem：视频消息。
     * TIMRelayElem：合并转发消息。
     */
    private String MsgType;

    /**
     * 消息元素的内容，不同的 MsgType 有不同的 MsgContent 格式
     * 使用JSONObject存储原始数据，以便在工厂方法中根据MsgType创建具体对象
     */
    private JSONObject MsgContent;
  }

  /**
   * 消息内容基类
   */
  @Data
  public static class MsgContent {
    // 基类可以为空或包含公共字段
  }

  /**
   * 文本消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMTextElem extends MsgContent {
    /**
     * 消息内容。当接收方为 iOS 或 Android 后台在线时，作为离线推送的文本展示。
     */
    private String Text;
  }

  /**
   * 图像消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMImageElem extends MsgContent {
    /**
     * 图片唯一标识
     */
    private String UUID;

    /**
     * 图片格式。
     * JPG = 1
     * GIF = 2
     * PNG = 3
     * BMP = 4
     * 其他 = 255
     */
    private Integer ImageFormat;

    /**
     * 原图、缩略图或者大图下载信息。
     */
    private List<ImageInfoArray> ImageInfoArray;

    @Data
    public static class ImageInfoArray {
      /**
       * 图片类型
       * 1：原图
       * 2：大图
       * 3：缩略图
       */
      private Integer Type;

      /**
       * 图片大小（字节）
       */
      private Long Size;

      /**
       * 图片宽度(像素)
       */
      private Integer Width;

      /**
       * 图片高度(像素)
       */
      private Integer Height;

      /**
       * 图片下载链接
       */
      private String Url;
    }
  }

  /**
   * 语音消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMSoundElem extends MsgContent {
    /**
     * 语音唯一标识
     */
    private String UUID;

    /**
     * 语音时长（秒）
     */
    private Integer Second;

    /**
     * 语音大小（字节）
     */
    private Long Size;

    /**
     * 语音下载链接
     */
    private String Url;

    /**
     * 语音下载方式标记。目前 Download_Flag 取值只能为2，表示可通过Url字段值的 URL 地址直接下载语音。
     */
    private Integer Download_Flag;
  }

  /**
   * 视频消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMVideoFileElem extends MsgContent {
    /**
     * 视频下载地址。可通过该 URL 地址直接下载相应视频。
     */
    private String VideoUrl;

    /**
     * 视频的唯一标识，客户端用于索引视频的键值。
     */
    private String VideoUUID;

    /**
     * 视频数据大小，单位：字节。
     */
    private Long VideoSize;

    /**
     * 视频时长，单位：秒。Web 端不支持获取视频时长，值为0。
     */
    private Integer VideoSecond;

    /**
     * 视频格式，例如 mp4。
     */
    private String VideoFormat;

    /**
     * 视频下载方式标记。目前 VideoDownloadFlag 取值只能为2，表示可通过 VideoUrl 字段值的 URL 地址直接下载视频。
     */
    private Integer VideoDownloadFlag;

    /**
     * 视频缩略图下载地址。可通过该 URL 地址直接下载相应视频缩略图。
     */
    private String ThumbUrl;

    /**
     * 视频缩略图的唯一标识，客户端用于索引视频缩略图的键值。
     */
    private String ThumbUUID;

    /**
     * 缩略图大小，单位：字节。
     */
    private Long ThumbSize;

    /**
     * 缩略图宽度，单位为像素。
     */
    private Integer ThumbWidth;

    /**
     * 缩略图高度，单位为像素。
     */
    private Integer ThumbHeight;

    /**
     * 缩略图格式，例如 JPG、BMP 等。
     */
    private String ThumbFormat;

    /**
     * 视频缩略图下载方式标记。目前 ThumbDownloadFlag 取值只能为2，表示可通过 ThumbUrl 字段值的 URL 地址直接下载视频缩略图。
     */
    private Integer ThumbDownloadFlag;
  }

  /**
   * 文件消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMFileElem extends MsgContent {
    /**
     * 文件的唯一标识，客户端用于索引文件的键值。
     */
    private String UUID;

    /**
     * 文件大小（字节）
     */
    private Long FileSize;

    /**
     * 文件名称
     */
    private String FileName;

    /**
     * 文件下载地址，可通过该 URL 地址直接下载相应文件。
     */
    private String Url;

    /**
     * 文件下载方式标记。目前 Download_Flag 取值只能为2，表示可通过Url字段值的 URL 地址直接下载文件。
     */
    private Integer Download_Flag;
  }

  /**
   * 自定义消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMCustomElem extends MsgContent {
    /**
     * 自定义消息数据
     */
    private String Data;
  }

  /**
   * 地理位置消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMLocationElem extends MsgContent {
    /**
     * 经度
     */
    private Double Longitude;

    /**
     * 纬度
     */
    private Double Latitude;

    /**
     * 地理位置描述
     */
    private String Desc;
  }

  /**
   * 表情消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMFaceElem extends MsgContent {
    /**
     * 表情索引
     */
    private Integer Index;

    /**
     * 表情数据
     */
    private String Data;
  }

  /**
   * 合并转发消息内容
   */
  @Data
  @EqualsAndHashCode(callSuper = true)
  public static class TIMRelayElem extends MsgContent {
    /**
     * 合并转发消息的标题。
     */
    private String Title;

    /**
     * 被转发的消息条数。
     */
    private Integer MsgNum;

    /**
     * 兼容文本。当不支持合并转发消息的老版本 SDK 收到此类消息时，IM 后台会将该消息转化成兼容文本再下发。
     */
    private String CompatibleText;

    /**
     * 合并消息的摘要列表，是一个 String 数组。
     */
    private List<String> AbstractList;

    /**
     * 消息列表。当被转发的消息长度之和小于等于12K时才会有此字段，此时不会有 JsonMsgKey 字段。
     */
    private List<MsgList> MsgList;

    /**
     * 合并转发的消息列表 Key。当被转发的消息长度之和大于12K时才会有此字段，此时不会有 MsgList 字段。
     */
    private String JsonMsgKey;

    @Data
    public static class MsgList {
      /**
       * 消息发送方 UserID。被转发的消息为单聊或群聊时都有此字段。
       */
      private String FromAccount;
      /**
       * 消息接收方 UserID。被转发的消息为单聊才有此字段。
       */
      private String ToAccount;
      /**
       * 群组 ID。被转发的消息为群聊才有此字段。
       */
      private String GroupId;
      /**
       * 消息序列号。
       */
      private Integer MsgSeq;
      /**
       * 消息随机数。
       */
      private Integer MsgRandom;
      /**
       * 消息时间戳。
       */
      private Integer MsgTimeStamp;
      /**
       * 消息内容。（注意，一条消息可包括多种消息元素，MsgBody 为 List 类型）
       */
      private List<MsgBody> MsgBody;
      /**
       * 消息自定义数据（云端保存，会发送到对端，程序卸载重装后还能拉取到）。
       */
      private String CloudCustomData;
    }
  }
}